import java.util.*;

public class Test18 {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int V=in.nextInt();
        int n=in.nextInt();
        int[][] vw=new int[n][2];
        for(int i=0;i<n;i++){
            vw[i][0]=in.nextInt();
            vw[i][1]=in.nextInt();
        }
        System.out.println(knapsack(V, n, vw));
    }
    public static int knapsack (int V, int n, int[][] vw) {
        PriorityQueue<int[]> p = new PriorityQueue<>(new Comparator<int[]>() {
            // 我将下标，物品重量存进去
            @Override
            public int compare(int[] o1, int[] o2) {
                return o2[1] - o1[1];
            }
        });
        for (int i = 0; i < n; i++) {
            p.add(new int[] {i, vw[i][1]});
        }
        int[] arr = new int[n];
        int[] brr = new int[n];
        int suma = 0; // 记录承重
        int sumb = 0; // 记录所占体积

        for (int left = 0, right = 0; right < n; right++) {
            while (right <n && sumb <= V) {
                int[] peek = p.poll();
                arr[right] = peek[1];
                brr[right] = vw[peek[0]][0];
                suma += peek[1];
                sumb += vw[peek[0]][0];
                right++;
            }
            if (sumb > V) {
                sumb -= brr[right-1];
                suma -= arr[right-1];
                right--;
            }
        }
        return  suma;
    }














    public static void main02(String[] args) {
        // 存在问题，当第一个酸度min时，后面想记录第二小的酸度记录不了
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            int k = in.nextInt();
            int[] a=new int[n];
            int[] b=new int[n];
            for(int i=0;i<n;i++){
                // 酸度
                a[i]=in.nextInt();
            }
            for(int i=0;i<n;i++){
                // 甜度
                b[i]=in.nextInt();
            }
            // 建立一个小根堆
            PriorityQueue<Integer> p=new PriorityQueue<>();

            int suma=0;
            int sumb=0;
            int len=0;
            int[] i=new int[n];
            int j=0;
            i[j++]=len;
            while(len<n){
                while(len<k){
                    p.add(b[len]);
                    suma+=a[len];
                    sumb+=b[len];
                    // 每次记录酸度的最小值 的下标，

                    if(len!=0) {
                        // 方便后面判断甜度相等时候，在判断酸度
                        if (a[len] < a[i[j-1]]){
                            i[j++]=len;
                        }
                        if (a[len] == a[i[j-1]]){
                            if(b[len] < b[i[j-1]])
                                i[j++]=len;
                        }
                    }
                    len++;
                }if(len>=k){
                    // 先创建了一个小根堆
                    if(b[len] > p.peek()){
                        sumb+=b[len];
                        sumb-= p.peek();
                        suma-=a[j--];
                        suma+=a[len];
                        p.poll();
                        p.add(b[len++] );
                    }else if(b[len] == p.peek()){
                        if(a[len] < a[i[j-1]]){
                            p.poll();
                            p.add(b[len]);
                            sumb-=p.peek();
                            suma-=a[j--];
                            i[j]=len;
                        }
                    }
                        len++;

                }
            }
            System.out.println(suma+" "+sumb);
        }

    }









    public static void main01(String[] args) {
        String param="Aababb";

        System.out.println(compressString(param).toString());
    }

    public static String compressString (String param) {
        StringBuilder s = new StringBuilder("");



        for (int left = 0, right = 0; right < param.length(); right++) {
            int len = 0;
            while (right < param.length() && param.charAt(right) == param.charAt(left)) {
                len++;
                right++;

            }
            if (len > 1) {
                s.append(param.charAt(right-len));
                Stack<Integer> stack=new Stack<>();
                while(len >10){
                    stack.add(len%10);
                    len/=10;
                }
                s.append((char)(len+'0'));
                while(!stack.isEmpty()){
                    s.append((char)(stack.pop()+'0'));
                }

            } else {
                s.append(param.charAt(left));
            }
            left=right;
            right--;


        }
        return s.toString();
    }
}
